L21: Větve v Gitu

linux.edumach.cz



Doposud jsme pracovali jen na jedné větvi – master (nebo main).

Větve slouží k tomu, abychom mohli vyvíjet více variant projektu nezávisle na sobě.

Představ si větve jako „paralelní časové linie“. Každá má vlastní historii commitů, ale mohou se kdykoliv spojit (merge).

1. Vytvoření nové větve

$ git branch nova-funkce

Tím se vytvoří větev nova-funkce.

Seznam všech větví:

$ git branch

Aktuální větev je označena hvězdičkou:

* master
  nova-funkce

2. Přepnutí na větev

$ git checkout nova-funkce

Od teď se všechny nové commity ukládají do větve nova-funkce. V hlavní větvi (master) se nic nezmění.

Návrat zpět:

$ git checkout master

3. Spojení větví (merge)

Pokud je funkce hotová a chceme ji vrátit do hlavní větve:

Přepni se na hlavní větev:

$ git checkout master    

Sluč změny:

$ git merge nova-funkce    

Hotovo – změny z vedlejší větve se přidají do master.

4. Shrnutí

5. 💾 Ukázka práce s větvemi

Vytvoření hlavního souboru

Nejprve si založíme nový soubor recept.txt a přidáme do něj tento obsah:

Recept na bábovku
=================

Uděláme commit:

$ git add -A
$ git commit -m "Vytvořen soubor recept.txt"

5.1. Vytvoření větve

$ git branch babovka2

Výpis větví:

$ git branch
* master
  babovka2

5.2. Přepnutí na novou větev

$ git checkout babovka2

Upravíme soubor recept.txt:

Recept na bábovku
=================
Mouka
Vejce
Olej
Mléko
Cukr

Commit na větvi babovka2:

$ git add -A
$ git commit -m "Přidány suroviny na bábovku"

5.3. Návrat na hlavní větev

$ git checkout master

Soubor recept.txt nyní obsahuje jen:

Recept na bábovku
=================

Tj. změny z větve babovka2 tu nejsou.

5.4. Sloučení větve do hlavní

⚠️ Při slučování musíme být ve té větvi, do které chceme mergovat jinou větev. V této ukázce jsme ve větvi master do které chceme sloučit změny z větve babovka2.

$ git checkout master
$ git merge babovka2

Výstup bude něco jako:

Updating 8e3111c..f19a959
Fast-forward
 recept.txt | 1 +
 1 file changed, 1 insertion(+)

Teď i na hlavní větvi (master) vidíš změnu:

Recept na bábovku
=================
Mouka
Vejce
Olej
Mléko
Cukr

6. Konflikty při "mergování"

Při práci s větvemi se může stát, že dva lidé upraví stejný řádek ve stejném souboru. Git pak neví, kterou verzi má použít, a označí to jako konflikt. Nejde o chybu, ale o přirozenou situaci, kdy musí rozhodnout člověk.

6.1. Jednoduchý příklad

Máme soubor recept.txt:

Recept na bábovku
=================
Mouka
Vejce
Olej
Mléko
Cukr

Ve větvi master někdo změní řádek souboru recept.txt na:

Recept na bábovku
=================
Mouka
Vejce 3 ks
Olej
Mléko
Cukr

Ve větvi babovka2 někdo změní stejný řádek v souboru recept.txt jinak:

Recept na bábovku
=================
Mouka
Vejce 4 ks
Olej
Mléko
Cukr

6.1.1. Co se stane při mergi

Když Git zkusí sloučit babovka2 do master, zobrazí konflikt:

<<<<<<< HEAD
Vejce 3 ks
=======
Vejce 4 ks
>>>>>>> babovka2

6.1.2. Řešení

Otevřeme soubor recept.txt:

<<<<<<< HEAD
Vejce 3 ks
=======
Vejce 4 ks
>>>>>>> babovka2

Ručně vybereme správnou verzi a to tak, že smažeme oba řádky s šipkami (<<<<<<< HEAD a >>>>>>> nova-vetev), řádek s ======= a ponecháme pouze jednu variantu, např. Vejce 4 ks:

...
Vejce 4 ks
...

Následně označíme soubor jako vyřešený:

git add recept.txt

Dokončíme merge commitem:

git commit -m "vyřešen konflikt v souboru recept.txt"

✅ Tímto je konflikt vyřešen a můžeme pokračovat dál.

7. Shrnutí